package com.lmf.spring5;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * 演示JDK动态代理：
 */
public class JDKProxy {
    public static void main(String[] args) {
        //创建接口字节码对象，集合
        Class[] interfaces = {UserDao.class};
        //创建被代理对象
        UserDaoImpl userDaoimpl = new UserDaoImpl();
//        System.out.println(JDKProxy.class.getClassLoader());
//        System.out.println(UserDaoProxy.class.getClassLoader());
//        System.out.println(UserDaoImpl.class.getClassLoader());
//        System.out.println(Object.class.getClassLoader());
//        System.out.println(String.class.getClassLoader());
//        System.out.println(Mss.class.getClassLoader());
//        System.out.println("----------------------------------");

        UserDao userDao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDaoimpl));
        int result = userDao.add(1, 2);
        System.out.println(result);
    }
}

//创建代理对象代码
class UserDaoProxy implements InvocationHandler {
    //1 把创建的是谁的代理对象，把谁传递过来
    //有参数构造传递
    private Object obj;//这里是为了更加通用，所以写成Object类型

    public UserDaoProxy(Object obj) {
        this.obj = obj;
    }

    /**
     * 增强的逻辑方法
     *
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //方法增强之前
        System.out.println("方法增强之前:" + method.getName() + ";传递的参数：" + Arrays.toString(args));
        //执行被增强的方法
        Object res = method.invoke(obj, args);
        //方法增强之后
        System.out.println("方法增强之后:" + obj);
        return res;
    }
}